﻿using System.Threading;
using Syntezator_mowy;
using Syntezator_mowy.Extras;
using Syntezator_mowy.SDDBD;
using Syntezator_mowy.Transmiter;
using Syntezator_mowy.Converter;
using System.IO;

using Microsoft.Xna.Framework.Audio;

namespace SerwerKomunikacyjnyService
{
    class SerwerKomunikacyjny : ISerwerKomunikacyjny
    {
        private Serwer bazaDanych;
        private string pathToLame;
        private SynchrBuffer<InputParameters> buforWejsciowy;
        private SynchrBuffer<string> przetworzonePliki;

        private FileTransmiter transmiter;
        private Kontroler kontroler;

        private Thread kontrolerThread;

        public SerwerKomunikacyjny()
        {
            this.bazaDanych = new Serwer();

            this.pathToLame = @"C:\inz\lame3.99.5\lame.exe";

            this.buforWejsciowy = new SynchrBuffer<InputParameters>();
            this.przetworzonePliki = new SynchrBuffer<string>();

           this.transmiter = new FileTransmiter(ref buforWejsciowy);

            this.kontroler = new Kontroler(ref buforWejsciowy, ref przetworzonePliki, bazaDanych);

           this.kontrolerThread = new Thread(new ParameterizedThreadStart(kontroler.run));
            this.kontrolerThread.Start((object)pathToLame);
        }
        public string przeksztalcNaTekst(string daneWejsciowe)
        {
            
            byte[] danePrzetworzone = System.Convert.FromBase64String(daneWejsciowe);

            // To do: utworz randomizowanaSciezke wejsciowa i wyjsciowa
            string sciezkaWejsciowa = @"C:\test\wejscie.wma";
            string sciezkaWyjsciowa = @"C:\test\wyjscie.txt";


            using (var targetFile = System.IO.File.Create(sciezkaWejsciowa))
            {
                WaveHeaderWriter.WriteHeader(targetFile, 1048576, 1, 16000);
                targetFile.Write(danePrzetworzone, 0, 1048576);
                targetFile.Flush();
                targetFile.Close();
            }
            
            WavToMp3Converter.WavToWma(this.pathToLame, sciezkaWejsciowa);



           InputParameters dane = new InputParameters(sciezkaWejsciowa.Split('.')[0] + ".wma", sciezkaWyjsciowa, Jezyk.POLSKI, Action.SP);

            Thread transmiterThread = new Thread(new ParameterizedThreadStart(transmiter.run));
            transmiterThread.Start((object)dane);

            while (!this.kontroler.przetworzono)
            {
                Thread.Sleep(100);
            }

            string daneWyjsciowe = "";
            using (System.IO.StreamReader reader = new System.IO.StreamReader(sciezkaWyjsciowa))
            {
                daneWyjsciowe = reader.ReadToEnd();
            }
           
            
           //return "Gdansk";
           return daneWyjsciowe;
        }
    }
}
